﻿using System.ComponentModel.DataAnnotations;

namespace wwl.Contract.Dtos.Common
{
  /// <summary>
  /// 分页查询请求的抽象基类，封装了分页、排序、字段筛选及关联属性查询的通用参数
  /// </summary>
  /// <remarks>
  /// 用于统一分页查询场景的请求参数格式，派生类可根据具体业务需求添加额外查询条件。
  /// 内置参数均通过数据注解和属性逻辑确保合法性，支持与ASP.NET Core模型验证机制配合使用。
  /// </remarks>
  public abstract class PagedRequest
  {
    private int _pageIndex = 1;
    private int _pageSize = 20;

    /// <summary>
    /// 页码（从1开始）
    /// </summary>
    [Range(1, int.MaxValue, ErrorMessage = "页码必须大于等于1")]
    public int PageIndex
    {
      get => _pageIndex;
      set => _pageIndex = Math.Max(value, 1); // 确保页码不小于1
    }

    /// <summary>
    /// 每页记录数
    /// </summary>
    [Range(1, 100, ErrorMessage = "每页记录数必须在1-100之间")]
    public int PageSize
    {
      get => _pageSize;
      set => _pageSize = Math.Clamp(value, 1, 100); // 限制在1-100之间
    }

    /// <summary>
    /// 排序字段（支持单个字段）
    /// </summary>
    [RegularExpression(@"^[a-zA-Z0-9_]{1,50}$", ErrorMessage = "排序字段只能包含字母、数字和下划线，且长度不超过50")]
    public string? SortBy { get; set; }

    /// <summary>
    /// 是否降序排序
    /// </summary>
    public bool SortDesc { get; set; } = false;

    /// <summary>
    /// 需要返回的字段列表（逗号分隔，如"Id,Name"）
    /// </summary>
    [RegularExpression(@"^[a-zA-Z0-9_,]*$", ErrorMessage = "返回字段只能包含字母、数字、下划线和逗号")]
    [MaxLength(500, ErrorMessage = "返回字段列表长度不能超过500个字符")]
    public string? Fields { get; set; }

    /// <summary>
    /// 需要包含的关联属性（逗号分隔，如"User,Orders"）
    /// </summary>
    [RegularExpression(@"^[a-zA-Z0-9_,]*$", ErrorMessage = "关联属性只能包含字母、数字、下划线和逗号")]
    [MaxLength(500, ErrorMessage = "关联属性列表长度不能超过500个字符")]
    public string? IncludeProperties { get; set; }
  }
}
